package util;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PublicKey;
import java.security.Security;
import java.security.spec.ECGenParameterSpec;

/**
 * 该工具类用于生成 SM2 椭圆曲线加密算法的密钥对，并将公钥进行 Base64 编码。
 * SM2 是中国国家密码管理局发布的一种椭圆曲线公钥密码算法。
 */
public class SM2KeyGeneratorUtil {

    // 静态代码块，在类加载时执行，用于向 Java 安全系统中添加 Bouncy Castle 安全提供者
    static {
        // Bouncy Castle 提供了丰富的加密算法实现，这里将其添加到安全提供者列表中，以便后续使用
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * 生成 SM2 椭圆曲线加密算法的密钥对。
     *
     * @return 生成的 SM2 密钥对
     * @throws Exception 如果在生成密钥对过程中出现异常，如算法不支持、参数错误等
     */
    public static KeyPair generateSM2KeyPair() throws Exception {
        // 创建一个椭圆曲线参数规范对象，指定使用 SM2 算法的曲线参数 "sm2p256v1"
        ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");
        // 获取一个椭圆曲线密钥对生成器实例，指定使用的算法为 "EC"（椭圆曲线算法），提供者为 "BC"（Bouncy Castle）
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");
        // 使用指定的椭圆曲线参数规范初始化密钥对生成器
        keyPairGenerator.initialize(sm2Spec);
        // 调用生成器的 generateKeyPair 方法生成密钥对并返回
        return keyPairGenerator.generateKeyPair();
    }

    /**
     * 获取密钥对中的公钥，并将其进行 Base64 编码。
     *
     * @param keyPair 包含公钥和私钥的密钥对对象
     * @return 公钥的 Base64 编码字符串
     */
    public static String getPublicKeyBase64(KeyPair keyPair) {
        PublicKey publicKey = keyPair.getPublic();
        return Base64.toBase64String(publicKey.getEncoded());
    }
}
